iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

今晚我想來點 Ruby on Rails 系列 第 8

<Day 8>今天來學學 Select 方法

  • 分享至 

  • xImage
  •  

可以在 ruby 裡使用 select 方法來篩選陣列的物件,例如可以在陣列裡找出所有偶數的值。如果不用 select 方法可以這樣做:

even_numbers = []
[1,2,3,4,5,6].each do |n|
  if n.even?
    even_numbers << n
  end
end
even_numbers

以這麼簡單的目的來說,這樣程式碼算有點長,現在來看看 select 方法怎麼做。使用 select 方法需要一個 block。在一個 block 裡需要回傳 true 或是 false,這樣 select 方法就可以對陣列做篩選,這裡也會用到一些布林值多看多學。

[1,2,3,4,5,6].select { |n| n.even? }

這段程式碼跟一個範例是一樣的,但是少了很多程式碼。事實上還可以這樣寫:

[1,2,3,4,5,6].select(&:even?)

這樣的簡寫只在“對陣列裡每個元素呼叫一個方法”的時後有用。除了陣列以外也可以對雜湊呼叫。

stock = {
  apples: 10,
  oranges: 5,
  bananas: 1
}
stock.select { |k, v| v > 1 }
# {:apples=>10, :oranges=>5}

k 代表 key & v 代表 values,上面的程式碼翻成白話文的意思就是說:
"找到所有庫存大於 1 的水果"

用其他方法結合 Select 方法

可以用許多的方法結合 select 一起使用,最常用的是 with_index 方法。

fruits = %w(apple orange banana)
fruits.select.with_index { |word, idx| idx.even? }
# ["apple", "banana"]

這個方法可以使用 index 來代替物件本身篩選(以這裡的例子是字串)。對陣列使用 select 方法永遠會產生一個陣列,如果想要改變原始的陣列可以使用 select! 方法。

fruits = %w(apple orange banana)
fruits.select! { |fruit| fruit.start_with? "a" }
# ["apple"]

在方法結尾加上驚嘆號 (select!) 會回傳一個新的物件改變原本的物件,但是語言本身不會強制執行這個規則。

Find vs Select

想要篩選表單的時候 select 方法是很好的選擇,得到一個陣列的結果。如果只想要找到一個物件呢?可以使用 find 方法

letters = %w(a aa aaa aaaa)
letters.find { |l| l.size == 3 }
# "aaa"
letters.find { |l| l.size == 10 }
# nil

Find 方法會找到第一個符合條件的物件,沒有找到符合的會得到 nil。

了解所有 Find 方法

如果對 find_all 方法與其他 find & select 感到疑惑,其實沒有這麼複雜,find_all 方法是 select 的別名。find 方法可以找到單一特定物件而不是多個物件。

Select 方法的反義詞

可以把元素移除而不是像 select 方法選擇出來,也是可以用 select 做到:

[1,2,3,4,5,6].select { |n| n != 4 }

reject 方法可以解決這個問題。

[1,2,3,4,5,6].reject { |n| n == 4 }

沒有任何技術、效能問題或其他條件,但會讓你的程式碼有更好的閱讀性。


上一篇
<Day 7>什麼是 rails 的 parameters & 如何使用
下一篇
<Day 9>where, find_by, find,今夜の注文はとつち?
系列文
今晚我想來點 Ruby on Rails 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言